package com.jsbs.iam.user.mapper;

import com.jsbs.iam.user.dto.OrgInfoAddDto;
import com.jsbs.iam.user.dto.OrgInfoDeleteDto;
import com.jsbs.iam.user.entity.IamAdminRoleOrgInfo;
import com.jsbs.iam.user.entity.IamOrgFramework;
import com.jsbs.iam.user.entity.IamOrgTypeExtendedField;
import com.jsbs.iam.user.vo.AdminRoleOrgVo;
import com.jsbs.iam.user.vo.OrgInfoTypeVo;
import com.jsbs.iam.user.vo.OrgInfoVo;
import com.jsbs.iam.user.vo.OrgThreeInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

@Mapper
@Repository
public interface OrgInfoMapper {
    /**
     * 功能描述；根据code统计
     * @param orgCode
     * @return
     */
    int countByOrgCode(@Param("companyCode") String companyCode, @Param("dataSource") String dataSource, @Param("orgCode") String orgCode);

    /**
     * 功能描述：批量新增
     * @param orgList
     */
    void batchInsert(@Param("list") List<IamOrgFramework> orgList);

    /**
     * 功能描述：批量更新
     * @param updateList
     */
    void batchUpdate(@Param("list") List<IamOrgFramework> updateList);


    /**
     * 根据组织类型编码查询组织数据
     * @param code
     * @return
     */
    List<OrgThreeInfo> selectOrgInfo(@Param("code") String code, @Param("companyCode") String companyCode);


    /**
     * 获取组织类型扩展字段数据
     *
     * @param orgTypeCode
     * @param companyCode
     * @return
     */
    List<IamOrgTypeExtendedField> getOrgTypeExtend(@Param("orgTypeCode") String orgTypeCode, @Param("companyCode") String companyCode);


    /**
     * 新增组织数据
     * @param orgInfoAddDto
     */
    void addOrgInfo(@Param("orgInfoAddDto")OrgInfoAddDto orgInfoAddDto);


    /**
     * 保存扩展字段数据
     * @param fieldMap
     */
    void insetExtendData(@Param("fieldMap")List<Map<String, String>> fieldMap);

    /**
     * 通过编码获取下级组织编码
     *
     * @param orgCode
     * @param companyCode
     * @return
     */
    List<String> selectSubOrgCode(@Param("orgCode")String orgCode, @Param("companyCode")String companyCode);

    /**
     * 功能描述：根据组织获取角色ID
     * @param orgName
     * @return
     */
    List<Long> queryByOrgName(@Param("orgName") String orgName);

    /**
     * 功能描述：获取组织权限列表
     * @param id
     * @return
     */
    List<AdminRoleOrgVo> getOrgList(@Param("roleId") Long id);

    /**
     * 通过组织类型编码查询一级组织编码
     * @param orgInfoAddDto
     * @return
     */
    String getSubOrgCodeByOrgCode(@Param("orgInfoAddDto")OrgInfoAddDto orgInfoAddDto);

    /**
     * 功能描述：批量删除组织权限
     * @param id
     */
    void deleteByRoleId(@Param("roleId") Long id);

    /**
     * 功能描述：批量新增组织权限
     * @param orgInfoList
     */
    void batchInsertAdminOrg(@Param("list") List<IamAdminRoleOrgInfo> orgInfoList);

    /**
     * 功能描述：获取组织信息
     * @param orgcodeList
     * @param orgTypeCode
     * @return
     */
    List<OrgInfoTypeVo> queryByCode(@Param("list") List<String> orgcodeList, @Param("orgTypeCode") String orgTypeCode);

    /**
     * 通过组织编码逻辑删除组织数据
     * @param deleteDto
     */
    void deleteOrgData(@Param("deleteDto") OrgInfoDeleteDto deleteDto);

    /**
     * 根据组织编码查询组织主数据
     * @param orgInfoAddDto
     * @return
     */
    IamOrgFramework selectOrgMainData(@Param("orgInfoAddDto") OrgInfoAddDto orgInfoAddDto);

    /**
     * 根据组织编码查询组织扩展字段数据
     * @param orgInfoAddDto
     * @return
     */
    List<Map<String, String>> selectOrgExtendedData(@Param("orgInfoAddDto") OrgInfoAddDto orgInfoAddDto);

    /**
     * 更新组织主数据
     * @param orgInfoAddDto
     */
    void updateOrgMainData(@Param("orgInfoAddDto")OrgInfoAddDto orgInfoAddDto);

    /**
     * 更新组织扩展数据
     * @param fieldMap
     */
    void updateOrgExtendedData(@Param("fieldMap")List<Map<String, String>> fieldMap);

    /**
     * 根据组织编码获取对应层级
     *
     * @param orgCode
     * @param companyCode
     * @return
     */
    int verifyLevel(@Param("orgCode")String orgCode, @Param("companyCode") String companyCode);

    /**
     * 修改组织层级之间的关系
     * @param orgInfoAddDto
     */
    void updateOrgLevel(@Param("orgInfoAddDto")OrgInfoAddDto orgInfoAddDto);

    /**
     * 获取组织类型的数据
     * @param orgTypeCode
     * @param companyCode
     * @return
     */
    List<OrgThreeInfo> selectOrgTypeInfo(@Param("orgTypeCode")String orgTypeCode, @Param("companyCode")String companyCode);

    /**
     * 通过组织编码删除组织扩展数据
     * @param deleteDto
     */
    void deleteExtendData(@Param("deleteDto") OrgInfoDeleteDto deleteDto);

    /**
     *根据组织类型编码获取组织类型数据
     * @param orgInfoAddDto
     * @return
     */
    OrgInfoVo selectOrgTypeData(@Param("orgInfoAddDto")OrgInfoAddDto orgInfoAddDto);

    /**
     * 获取所有组织架构数据
     * @param companyCode
     * @return
     */
    List<OrgThreeInfo> selectOrgAllInfo(@Param("companyCode") String companyCode);

    /**
     * 获取组织类型的数据
     * @param companyCode
     * @return
     */
    List<OrgThreeInfo> selectOrgTypeAllInfo(@Param("companyCode") String companyCode);

    /**
     * 查询对应字段详细数据
     * @param fieldId
     * @param companyCode
     * @return
     */
    IamOrgTypeExtendedField getExtendInfo(@Param("fieldId")String fieldId, @Param("companyCode")String companyCode);

    /**
     * 校验扩展字段唯一性
     * @param fieldId
     * @param fieldData
     * @param companyCode
     * @return
     */
    int verifyIsSole(@Param("fieldId") String fieldId, @Param("fieldData") String fieldData, @Param("companyCode") String companyCode);

    /**
     * 获取指定扩展字段数据
     * @param fieldId
     * @param orgCode
     * @param companyCode
     * @return
     */
    String verifyFieldData(@Param("fieldId")String fieldId, @Param("orgCode")String orgCode, @Param("companyCode")String companyCode);

    /**
     * 获取当前登录人的组织权限
     * @param userCode
     * @return
     */
    List<String> getUserOrgPermission(@Param("userCode") String userCode);

    /**
     * 查询权限范围内的组织类型
     * @param userCode
     * @return
     */
    List<String> getUserOrgTypePermission(@Param("userCode") String userCode);

    /**
     * 通过组织类型查询组织编码
     * @param orgTypeCode
     * @param companyCode
     * @return
     */
    List<String> getOrgCodesByOrgType(@Param("orgTypeCode")String orgTypeCode, @Param("companyCode")String companyCode);

    /**
     * 通过组织父级编码查询下级组织编码
     * @param orgInfoAddDto
     * @return
     */
    String getSubOrgCodeBySuperCode(@Param("orgInfoAddDto")OrgInfoAddDto orgInfoAddDto);
}
